<?php

/**
 * Zend Framework
 *
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://framework.zend.com/license/new-bsd
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@zend.com so we can send you a copy immediately.
 *
 * @category   Zend
 * @package    Zend_Feed
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 * @version    $Id: Header.php 16205 2009-06-21 19:08:45Z thomas $
 */

/**
 * @see Zend_Feed_Builder_Header_Itunes
 */
require_once 'Zend/Feed/Builder/Header/Itunes.php';

/**
 * @see Zend_Uri
 */
require_once 'Zend/Uri.php';


/**
 * Header of a custom build feed
 *
 * Classes implementing the Zend_Feed_Builder_Interface interface
 * uses this class to describe the header of a feed
 *
 * @category   Zend
 * @package    Zend_Feed
 * @copyright  Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/new-bsd     New BSD License
 */
class Zend_Feed_Builder_Header extends ArrayObject
{
	/**
	 * Constructor
	 *
	 * @param  string $title title of the feed
	 * @param  string $link canonical url of the feed
	 * @param  string $charset charset of the textual data
	 * @return void
	 */
	public function __construct($title, $link, $charset = 'utf-8')
	{
		$this->offsetSet('title', $title);
		$this->offsetSet('link', $link);
		$this->offsetSet('charset', $charset);
		$this->setLastUpdate(time())
		->setGenerator('Zend_Feed');
	}

	/**
	 * Read only properties accessor
	 *
	 * @param  string $name property to read
	 * @return mixed
	 */
	public function __get($name)
	{
		if (!$this->offsetExists($name)) {
			return NULL;
		}

		return $this->offsetGet($name);
	}

	/**
	 * Write properties accessor
	 *
	 * @param string $name  name of the property to set
	 * @param mixed  $value value to set
	 * @return void
	 */
	public function __set($name, $value)
	{
		$this->offsetSet($name, $value);
	}

	/**
	 * Isset accessor
	 *
	 * @param  string $key
	 * @return boolean
	 */
	public function __isset($key)
	{
		return $this->offsetExists($key);
	}

	/**
	 * Unset accessor
	 *
	 * @param  string $key
	 * @return void
	 */
	public function __unset($key)
	{
		if ($this->offsetExists($key)) {
			$this->offsetUnset($key);
		}
	}

	/**
	 * Timestamp of the update date
	 *
	 * @param  int $lastUpdate
	 * @return Zend_Feed_Builder_Header
	 */
	public function setLastUpdate($lastUpdate)
	{
		$this->offsetSet('lastUpdate', $lastUpdate);
		return $this;
	}

	/**
	 * Timestamp of the publication date
	 *
	 * @param  int $published
	 * @return Zend_Feed_Builder_Header
	 */
	public function setPublishedDate($published)
	{
		$this->offsetSet('published', $published);
		return $this;
	}

	/**
	 * Short description of the feed
	 *
	 * @param  string $description
	 * @return Zend_Feed_Builder_Header
	 */
	public function setDescription($description)
	{
		$this->offsetSet('description', $description);
		return $this;
	}

	/**
	 * Sets the author of the feed
	 *
	 * @param  string $author
	 * @return Zend_Feed_Builder_Header
	 */
	public function setAuthor($author)
	{
		$this->offsetSet('author', $author);
		return $this;
	}

	/**
	 * Sets the author's email
	 *
	 * @param  string $email
	 * @return Zend_Feed_Builder_Header
	 * @throws Zend_Feed_Builder_Exception
	 */
	public function setEmail($email)
	{
		/**
		 * @see Zend_Validate_EmailAddress
		 */
		require_once 'Zend/Validate/EmailAddress.php';
		$validate = new Zend_Validate_EmailAddress();
		if (!$validate->isValid($email)) {
			/**
			 * @see Zend_Feed_Builder_Exception
			 */
			require_once 'Zend/Feed/Builder/Exception.php';
			throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the email property");
		}
		$this->offsetSet('email', $email);
		return $this;
	}

	/**
	 * Sets the copyright notice
	 *
	 * @param  string $copyright
	 * @return Zend_Feed_Builder_Header
	 */
	public function setCopyright($copyright)
	{
		$this->offsetSet('copyright', $copyright);
		return $this;
	}

	/**
	 * Sets the image of the feed
	 *
	 * @param  string $image
	 * @return Zend_Feed_Builder_Header
	 */
	public function setImage($image)
	{
		$this->offsetSet('image', $image);
		return $this;
	}

	/**
	 * Sets the generator of the feed
	 *
	 * @param  string $generator
	 * @return Zend_Feed_Builder_Header
	 */
	public function setGenerator($generator)
	{
		$this->offsetSet('generator', $generator);
		return $this;
	}

	/**
	 * Sets the language of the feed
	 *
	 * @param  string $language
	 * @return Zend_Feed_Builder_Header
	 */
	public function setLanguage($language)
	{
		$this->offsetSet('language', $language);
		return $this;
	}

	/**
	 * Email address for person responsible for technical issues
	 * Ignored if atom is used
	 *
	 * @param  string $webmaster
	 * @return Zend_Feed_Builder_Header
	 * @throws Zend_Feed_Builder_Exception
	 */
	public function setWebmaster($webmaster)
	{
		/**
		 * @see Zend_Validate_EmailAddress
		 */
		require_once 'Zend/Validate/EmailAddress.php';
		$validate = new Zend_Validate_EmailAddress();
		if (!$validate->isValid($webmaster)) {
			/**
			 * @see Zend_Feed_Builder_Exception
			 */
			require_once 'Zend/Feed/Builder/Exception.php';
			throw new Zend_Feed_Builder_Exception("you have to set a valid email address into the webmaster property");
		}
		$this->offsetSet('webmaster', $webmaster);
		return $this;
	}

	/**
	 * How long in minutes a feed can be cached before refreshing
	 * Ignored if atom is used
	 *
	 * @param  int $ttl
	 * @return Zend_Feed_Builder_Header
	 * @throws Zend_Feed_Builder_Exception
	 */
	public function setTtl($ttl)
	{
		/**
		 * @see Zend_Validate_Int
		 */
		require_once 'Zend/Validate/Int.php';
		$validate = new Zend_Validate_Int();
		if (!$validate->isValid($ttl)) {
			/**
			 * @see Zend_Feed_Builder_Exception
			 */
			require_once 'Zend/Feed/Builder/Exception.php';
			throw new Zend_Feed_Builder_Exception("you have to set an integer value to the ttl property");
		}
		$this->offsetSet('ttl', $ttl);
		return $this;
	}

	/**
	 * PICS rating for the feed
	 * Ignored if atom is used
	 *
	 * @param  string $rating
	 * @return Zend_Feed_Builder_Header
	 */
	public function setRating($rating)
	{
		$this->offsetSet('rating', $rating);
		return $this;
	}

	/**
	 * Cloud to be notified of updates of the feed
	 * Ignored if atom is used
	 *
	 * @param  string|Zend_Uri_Http $uri
	 * @param  string               $procedure procedure to call, e.g. myCloud.rssPleaseNotify
	 * @param  string               $protocol  protocol to use, e.g. soap or xml-rpc
	 * @return Zend_Feed_Builder_Header
	 * @throws Zend_Feed_Builder_Exception
	 */
	public function setCloud($uri, $procedure, $protocol)
	{
		if (is_string($uri) && Zend_Uri_Http::check($uri)) {
			$uri = Zend_Uri::factory($uri);
		}
		if (!$uri instanceof Zend_Uri_Http) {
			/**
			 * @see Zend_Feed_Builder_Exception
			 */
			require_once 'Zend/Feed/Builder/Exception.php';
			throw new Zend_Feed_Builder_Exception('Passed parameter is not a valid HTTP URI');
		}
		if (!$uri->getPort()) {
			$uri->setPort(80);
		}
		$this->offsetSet('cloud', array('uri' => $uri,
                                        'procedure' => $procedure,
                                        'protocol' => $protocol));
		return $this;
	}

	/**
	 * A text input box that can be displayed with the feed
	 * Ignored if atom is used
	 *
	 * @param  string $title       the label of the Submit button in the text input area
	 * @param  string $description explains the text input area
	 * @param  string $name        the name of the text object in the text input area
	 * @param  string $link        the URL of the CGI script that processes text input requests
	 * @return Zend_Feed_Builder_Header
	 */
	public function setTextInput($title, $description, $name, $link)
	{
		$this->offsetSet('textInput', array('title' => $title,
                                            'description' => $description,
                                            'name' => $name,
                                            'link' => $link));
		return $this;
	}

	/**
	 * Hint telling aggregators which hours they can skip
	 * Ignored if atom is used
	 *
	 * @param  array $hours list of hours in 24 format
	 * @return Zend_Feed_Builder_Header
	 * @throws Zend_Feed_Builder_Exception
	 */
	public function setSkipHours(array $hours)
	{
		if (count($hours) > 24) {
			/**
			 * @see Zend_Feed_Builder_Exception
			 */
			require_once 'Zend/Feed/Builder/Exception.php';
			throw new Zend_Feed_Builder_Exception("you can not have more than 24 rows in the skipHours property");
		}
		foreach ($hours as $hour) {
			if ($hour < 0 || $hour > 23) {
				/**
				 * @see Zend_Feed_Builder_Exception
				 */
				require_once 'Zend/Feed/Builder/Exception.php';
				throw new Zend_Feed_Builder_Exception("$hour has te be between 0 and 23");
			}
		}
		$this->offsetSet('skipHours', $hours);
		return $this;
	}

	/**
	 * Hint telling aggregators which days they can skip
	 * Ignored if atom is used
	 *
	 * @param  array $days list of days to skip, e.g. Monday
	 * @return Zend_Feed_Builder_Header
	 * @throws Zend_Feed_Builder_Exception
	 */
	public function setSkipDays(array $days)
	{
		if (count($days) > 7) {
			/**
			 * @see Zend_Feed_Builder_Exception
			 */
			require_once 'Zend/Feed/Builder/Exception.php';
			throw new Zend_Feed_Builder_Exception("you can not have more than 7 days in the skipDays property");
		}
		$valid = array('monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday');
		foreach ($days as $day) {
			if (!in_array(strtolower($day), $valid)) {
				/**
				 * @see Zend_Feed_Builder_Exception
				 */
				require_once 'Zend/Feed/Builder/Exception.php';
				throw new Zend_Feed_Builder_Exception("$day is not a valid day");
			}
		}
		$this->offsetSet('skipDays', $days);
		return $this;
	}

	/**
	 * Sets the iTunes rss extension
	 *
	 * @param  Zend_Feed_Builder_Header_Itunes $itunes
	 * @return Zend_Feed_Builder_Header
	 */
	public function setITunes(Zend_Feed_Builder_Header_Itunes $itunes)
	{
		$this->offsetSet('itunes', $itunes);
		return $this;
	}
}
